www.gusucode.com > LTE基带收发仿真系统matlab源码程序 > LTE baseband simulation/de_modulate.m

    function demode_data = de_modulate(receive_signal,Qm)
% 函数实现功能:对接收到的信号进行调制,解调的方式由Qm决定
% Qm为2进行QPSK解调,Qm为4进行16QAM解调,Qm为6进行64QAM解调
% 输入:
%     receive_signal:调制输入信号
%                 Qm:调制方式对应的比特数
% 输出:
%        demode_data:存储解调后的结果
% 
%  Author:		程式小组(徐萌 张妙 张晓庆)
%  Date:		2010-07-11
%  ===========================================================


Isymbols = real(receive_signal);
Qsymbols = imag(receive_signal);
switch Qm
    case 2
        demode_data = QPSKdemode(Isymbols, Qsymbols);    % 进行QPSK解调
    case 4
        demode_data = QAM16demode(Isymbols, Qsymbols);   % 进行16QAM解调
    case 6
        demode_data = QAM64demode(Isymbols, Qsymbols);   % 进行64QAM解调
end

end

function output_data = QPSKdemode(Isymbols, Qsymbols)
% QPSK的软解调
% LLR采用欧式距离计算
% 输入QPSK符号的正交分量和同向分量
% 解调后的输出放在output_data中

len = length(Isymbols);
output_data = zeros(1,2*len);
for n = 1:len
   b0 = Isymbols(n);
   b1 = Qsymbols(n);
   output_data([2*(n-1)+1 2*n]) = [-b0,-b1];
end
% len = length(Isymbols);
% b1 = zeros(1,len);
% b0 = zeros(1,len);
% for n=1:len
%     % 接收信号到所有可能发射点的距离
%     Distance0 = (Isymbols(n)-(sqrt(2)/2))*(Isymbols(n)-(sqrt(2)/2)) + (Qsymbols(n)-(sqrt(2)/2))*(Qsymbols(n)-(sqrt(2)/2)); %pi/4
%     Distance2 = (Isymbols(n)+(sqrt(2)/2))*(Isymbols(n)+(sqrt(2)/2)) + (Qsymbols(n)-(sqrt(2)/2))*(Qsymbols(n)-(sqrt(2)/2)); %3pi/4
%     Distance3 = (Isymbols(n)+(sqrt(2)/2))*(Isymbols(n)+(sqrt(2)/2)) + (Qsymbols(n)+(sqrt(2)/2))*(Qsymbols(n)+(sqrt(2)/2)); %5pi/4
%     Distance1 = (Isymbols(n)-(sqrt(2)/2))*(Isymbols(n)-(sqrt(2)/2)) + (Qsymbols(n)+(sqrt(2)/2))*(Qsymbols(n)+(sqrt(2)/2)); %7pi/4  
%     % I支路
%     X=[Distance0,Distance1];    % 发射信号为0的集合
%     min_num = min(X);           % 求出发射信号为0的集合中的最小值
%     Y=[Distance2,Distance3];    % 发射信号为1的集合
%     min_denum = min(Y);         % 求出发射信号为1的集合中的最小值
%     b1(n) = min_num - min_denum; % I支路的LLR
%     % Q支路
%     X=[Distance0,Distance2];    % 发射信号为0的集合
%     min_num = min(X);           % 求出发射信号为0的集合中的最小值
%     Y=[Distance1,Distance3];    % 发射信号为1的集合
%     min_denum = min(Y);         % 求出发射信号为1的集合中的最小值
%     b0(n)= min_num - min_denum; % Q支路的LLR
%  end               
% % 并串变化
%     output_data(1:2:length(Isymbols)*2) = b1;
%     output_data(2:2:length(Isymbols)*2) = b0;   
end

function output_data = QAM16demode(Isymbols, Qsymbols)
% 16QAM的软解调
% LLR采用边界法计算
% 输入16QAM符号的正交分量和同向分量
% 解调后的输出放在output_data中
d = 1/sqrt(10);

Identify = [0 1];  % 定义示性函数
len = length(Isymbols);
% I支路
LLR_I = zeros(1,2);
LLR_Q = zeros(1,2);
for n = 1:len
    Distance_I1 = Isymbols(n);
    Distance_I2 = abs(Distance_I1)-2*d;
    Distance = [Distance_I1 Distance_I2];
    for k = 1:2
        if Identify(k)==1
            LLR_I(k) = Distance(k);
        else
            LLR_I(k) = -Distance(k);
        end
    end
    % Q支路
    Distance_Q1 = Qsymbols(n);
    Distance_Q2 = abs(Distance_Q1)-2*d;
    Distance = [Distance_Q1 Distance_Q2];
    for k = 1:2
        if Identify(k)==1
            LLR_Q(k) = Distance(k);
        else
            LLR_Q(k) = -Distance(k);
        end
    end
    output_data((n-1)*4+1:n*4) = [LLR_I(1) LLR_Q(1) LLR_I(2) LLR_Q(2)];
end
end

function output_data = QAM64demode(Isymbols, Qsymbols)
% 16QAM的软解调
% LLR采用边界法计算
% 输入16QAM符号的正交分量和同向分量
% 解调后的输出放在output_data中
d = 1/sqrt(42);
%Reliability = [1 2 3]; % 定义编码比特b_I的可靠性级别
Identify = [0 1 1];  % 定义示性函数

len = length(Isymbols);
LLR_I = zeros(1,3);
LLR_Q = zeros(1,3);
% I支路
for n = 1:len
    Distance_I1 = Isymbols(n);
    Distance_I2 = abs(Distance_I1)-4*d;
    Distance_I3 = abs(abs(Distance_I1)-4*d)-2*d;
    Distance = [Distance_I1 Distance_I2 Distance_I3];
    for k = 1:3
        if Identify(k)==1
            LLR_I(k) = Distance(k);
        else
            LLR_I(k) = -Distance(k);
        end
    end
    % Q支路
    Distance_Q1 = Qsymbols(n);
    Distance_Q2 = abs(Distance_Q1)-4*d;
    Distance_Q3 = abs(abs(Distance_Q1)-4*d)-2*d;
    Distance = [Distance_Q1 Distance_Q2 Distance_Q3];
    for k = 1:3
        if Identify(k)==1
            LLR_Q(k) = Distance(k);
        else
            LLR_Q(k) = -Distance(k);
        end
    end
    output_data((n-1)*6+1:n*6) = [LLR_I(1) LLR_Q(1) LLR_I(2) LLR_Q(2) LLR_I(3) LLR_Q(3)];
end
end